#define xuser mixc::powerful_cat
#include"lang/cxx/make_base64.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/array.hpp"

xinit(xuser::the_main){
    using namespace xuser;

    // 注意：
    // 每次返回的地址是一样的，所以是新值覆盖旧值的逻辑
    // 所以是新值覆盖旧值的逻辑
    enum { max_buffer = 128 };
    char buf[max_buffer];
    auto alloc = [&](uxx length) -> char * {
        if (length >= max_buffer){
            return nullptr; // 返回 null 并不会导致异常，只是会终止分配后续的操作，如果没有特殊要求，则会生成空串
        }
        else{
            buf[length] = '\0'; // \0 终结符不是必须的，如果你想和 cstr 兼容，可以这么做
            return buf;
        }
    };

    u08 s1234[4] = { '1', '2', '3', '4' };
    xhint(c08(make_base64, s1234, alloc));
    xhint(c08(make_base64, "1", alloc));
    xhint(c08(make_base64, "12", alloc));
    xhint(c08(make_base64, "123", alloc));
    xhint(c08(make_base64, "1234", alloc));
    xhint(c08(make_base64, "happy every day", alloc));
    xhint(c08(make_base64, "hello world", alloc));
    xhint(c08(make_base64, make_array('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'), alloc));

    // 注意：序列进行编码时需要考虑一个元素占用几个字节，编码后的大小总是和原始数据大小呈一定比值
    // 支持将序列按字节进行 base64 编码
    xhint(c08(make_base64, make_array(1, 2, 3, 4), alloc));

    // 注意双精度浮点数一个元素 8bytes
    xhint(c08(make_base64, make_array(1.2, 2.3, 3.4, 4.5), alloc));
};
